﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace bll
{
    /// <summary>
    /// clsProjectCollection: Verwalten der Menge von clsProject-Objekten
    /// </summary>
    public class clsProjectCollection
    {
        string _databaseFile;   // String zur Access-Datei, wird im Konstruktor initialisiert

        /// <summary>
        /// Project-Collection Konstruktor 
        /// </summary>
        public clsProjectCollection()
        {
            // hier wird der Pfad zur Access-Datei aus web.config gelesen
            _databaseFile = System.Configuration.ConfigurationManager.AppSettings["AccessFileName"];
        }

        /// <summary>
        /// Liest alle Projekte aus der DB und gibt sie als Liste zurück
        /// </summary>
        /// <returns></returns>
        public List<clsProject> getAllProject()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllProjects");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von Project-Objekten
            List<clsProject> _myProjectList = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Projekten
                clsProject _myProject = new clsProject();
                //und hier die Daten nach Index
                _myProject.ID = (int)_dr["PID"];
                _myProject.Name = (String)_dr["PName"];
                _myProject.Client = (String)_dr["PClient"];
                _myProject.ContractPrice = (int)_dr["PContractPrice"];
                _myProject.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
                _myProject.Active = (bool)_dr["PActive"];
                _myProjectList.Add(_myProject);
            }
            return _myProjectList;
        } //getAllProjects() 

        /// <summary>
        /// Liest alle Projekte aus der DB und gibt sie als Liste zurück (für das Management)
        /// </summary>
        /// <returns></returns>
        public List<clsProject> getAllProjectsForManagement()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllProjectsForManagement");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von Project-Objekten
            List<clsProject> _myProjectList = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Projekten
                clsProject _myProject = new clsProject();
                //und hier die Daten nach Index
                _myProject.Name = (String)_dr["PName"];
                _myProject.Client = (String)_dr["PClient"];
                _myProject.ContractPrice = (int)_dr["PContractPrice"];
                _myProject.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
                _myProject.Active = (bool)_dr["PActive"];
                _myProject.ContactPerson = (String)_dr["PContactPerson"];
                _myProject.Address = (String)_dr["PAddress"];
                _myProject.Postcode = (String)_dr["PPostCode"];
                _myProject.Location = (String)_dr["PLocation"];
                _myProject.TelNr = (String)_dr["PTelNr"];
                _myProject.Country = (String)_dr["PCountry"];
                _myProjectList.Add(_myProject);
            }
            return _myProjectList;
        } //getAllProjectsForManagement() 

        /// <summary>
        /// Update eines Projektobjekts
        /// </summary>
        /// <param name="_Project">Project-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls Update erfolgreich </returns>
        public int UpdateProject(clsProject _Project)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Access-Query)
            _myProvider.AddParam("Name", _Project.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Client", _Project.Client, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("ContractPrice", _Project.ContractPrice, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Active", _Project.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);
            _myProvider.AddParam("ContactPerson", _Project.ContactPerson, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("TelNr", _Project.TelNr, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("ID", _Project.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QProjectUpdateById");

            return _changedSets;
        } //updateProject()

        /// <summary>
        /// Löschen eines Projectobjekts
        /// </summary>
        /// <param name="_Project">Project-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls delete erfolgreich </returns>
        public int DeleteProject(clsProject _Project)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Übergabeparameter ID hinzufügen 
            _myProvider.AddParam("ID", _Project.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QProjectDeleteById");

            return _changedSets;
        } //deleteProject()

        /// <summary>
        /// Insert eines Projektobjekts
        /// </summary>
        /// <param name="_Project">Project-Objekt</param>
        /// <returns>1 falls Insert erfolgreich </returns>
        public int InsertProject(clsProject _Project)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Acess-Query)
            _myProvider.AddParam("Name", _Project.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Client", _Project.Client, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("ContractPrice", _Project.ContractPrice, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("ExternalHourlyRate", _Project.ExternalHourlyRate, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Active", _Project.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);
            _myProvider.AddParam("ContactPerson", _Project.ContactPerson, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Address", _Project.Address, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Postcode", _Project.Postcode, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Location", _Project.Location, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Country", _Project.Country, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("TelNr", _Project.TelNr, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
    
            //Ausführen und veränderte Zeilen zurückgeben
            int _setChange = _myProvider.MakeStoredProcedureAction("QProjectInsert");

            return _setChange;
        } //insertProject()

        /// <summary>
        /// Gibt Project nach einer ID zurück
        /// </summary>
        /// <param name="_id">ID des gesuchten Projects</param>
        /// <returns>Projekt-Objekt (oder NULL) </returns>
        public clsProject GetProjectById(int _id)
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", _id, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetProjectById");

            //füllen wir eine DataTable mit dem DataSet
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            clsProject _myProject = new clsProject();
            _myProject.ID = (int)_dr["PId"];
            _myProject.Name = (String)_dr["PName"];
            _myProject.Client = (String)_dr["PClient"];
            _myProject.ContractPrice = (int)_dr["PContractPrice"];
            _myProject.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
            _myProject.Active = (bool)_dr["Pactive"];

            return _myProject;
        } // getProjectbyId()


        /// <summary>
        /// Zählt Anzahl projects via SQL-Abfrage
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Projekte</returns>
        public int CountProject1()
        {
            int _count;

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QCountProjects");

            //das Ergebnis von QCountProjects ist eine Tabelle mit einer Zeile und einer Spalte
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            _count = (int)_dr[0];

            return _count;
        } // CountProjects1()

        /// <summary>
        /// Zählt Anzahl Projekte, indem erst alle eingelesen werden und dann Länge der Liste zurückgegeben wird
        /// (alternative Methode zu CountProject1())
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Projekte</returns>
        public int CountProject2()
        {
            int _count;
            List<clsProject> _ProjectList;

            _ProjectList = getAllProject();
            _count = _ProjectList.Count;

            return _count;
        } // CountProjects2()

        /// <summary>
        /// Gibt das Projekt und den zugehörigen Deckungsbeitrag zurück
        /// </summary>
        /// <returns></returns>
        public List<clsProject> getAllDb()
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QDBmanage");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von Project-Objekten
            List<clsProject> _myDbList = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Projekten
                clsProject _myDb = new clsProject();
                //und hier die Daten nach Index
                _myDb.Name = (String)_dr["PName"];
                _myDb.Db = (double)_dr["Db"];
                _myDbList.Add(_myDb);
            }
            return _myDbList;
        } //getAllDb() 

        /// <summary>
        /// Gibt das Projekt, den zugehörigen Deckungsbeitrag und viele anderen Werte zurück (fürs Controlling)
        /// </summary>
        /// <returns></returns>
        public List<clsProject> getAllDbMoreInfo()
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QDBmanageMoreInfo");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von Project-Objekten
            List<clsProject> _myDbList = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Projekten
                clsProject _myDb = new clsProject();
                //und hier die Daten nach Index
                _myDb.ID = (Int32)_dr["PId"];
                _myDb.Name = (String)_dr["PName"];
                _myDb.Client = (String)_dr["PClient"];
                _myDb.ContractPrice = (int)_dr["PcontractPrice"];
                _myDb.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
                _myDb.InternalHourlyRate = (Int32)_dr["UInternalHourlyRate"];
                _myDb.InternalCosts = (double)_dr["InternalCosts"];
                _myDb.ExternalCosts = (double)_dr["ExternalCosts"];
                _myDb.Db = (double)_dr["Db"];
                _myDbList.Add(_myDb);
            }
            return _myDbList;
        } //getAllDbMoreInfos() 

        /// <summary>
        /// Gibt alle relevanten Daten für die Rechnungstabelle des Kunden weiter..
        /// </summary>
        /// <returns></returns>
        public List<clsProject> GetCustomerCalcById()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", bll.clsUser.Session, DAL.DataDefinition.enumerators.SQLDataType.INT);

             //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetCalcDataForCustomer");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsProject> _myInvoice = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                clsProject _part = new clsProject();
                //_myInvoice.ID = (int)_dr["PId"];
                _part.Date = (DateTime)_dr["SDate"];
                _part.Hours = (int)_dr["SHours"];
                _part.Description = (String)_dr["SDescription"];
                _part.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
                _part.Costs = (int)_dr["Costs"];
                bll.clsProject.AllCosts = bll.clsProject.AllCosts + _part.Costs;
                _myInvoice.Add(_part);
            }
            return _myInvoice;
        } // GetCustomerCalcById()


        /// <summary>
        /// Gibt alle relevanten Daten für die Rechnungstabelle des Kunden weiter..
        /// </summary>
        /// <returns></returns>
        public List<clsProject> GetCustomerCalcById_Category()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", bll.clsUser.Session, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetCalcDataForCustomer_category");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsProject> _myInvoice = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                clsProject _part = new clsProject();
                _part.Category = (String)_dr["SCategory"];
                _part.Hours = (int)_dr["SHours"];
                _part.Costs = (int)_dr["Costs"];
                bll.clsProject.AllCosts2 = bll.clsProject.AllCosts2 + _part.Costs;
                _myInvoice.Add(_part);
            }
            return _myInvoice;
        } // getProjectbyId()

        /// <summary>
        /// Gibt alle relevanten Daten für die eigentliche Rechnung des Kunden weiter..
        /// </summary>
        /// <returns></returns>
        public clsProject GetCustomerDataById()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", bll.clsUser.Session, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetDataForInvoice");
            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            clsProject _myInvoice = new clsProject();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                _myInvoice.ID = (int)_dr["PId"];
                _myInvoice.Name = (String)_dr["PName"];
                _myInvoice.Client = (String)_dr["PClient"];
                _myInvoice.ContactPerson = (String)_dr["PContactPerson"];
                _myInvoice.Address = (String)_dr["PAddress"];
                _myInvoice.Postcode = (String)_dr["PPostCode"];
                _myInvoice.Location = (String)_dr["PLocation"];
                _myInvoice.Country = (String)_dr["PCountry"];
                _myInvoice.TelNr = (String)_dr["PTelNr"];
            }
            return _myInvoice;
        } // getProjectbyId()

        /// <summary>
        /// Liest alle aktiven Projekte aus der DB und gibt sie als Liste zurück
        /// </summary>
        /// <returns></returns>
        public List<clsProject> getActiveProjects()
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetActiveProjects");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von Project-Objekten
            List<clsProject> _myProjectList = new List<clsProject>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Projekten
                clsProject _myProject = new clsProject();
                //und hier die Daten nach Index
                _myProject.ID = (int)_dr["PID"];
                _myProject.Name = (String)_dr["PName"];
                _myProject.Client = (String)_dr["PClient"];
                _myProject.ContractPrice = (int)_dr["PContractPrice"];
                _myProject.ExternalHourlyRate = (int)_dr["PExternalHourlyRate"];
                _myProject.Active = (bool)_dr["PActive"];
                _myProjectList.Add(_myProject);
            }
            return _myProjectList;
        } //getActiveProjects() 
    }
}